/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sigodonto.view.managedbean;

import br.com.sigodonto.model.dao.TratamentoDao;
import br.com.sigodonto.model.entity.Atendimento;
import br.com.sigodonto.model.entity.Dentista;
import br.com.sigodonto.model.entity.Tratamento;
import br.com.sigodonto.model.util.CompromissoAgenda;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.event.ScheduleEntrySelectEvent;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;

/**
 *
 * @author Fidelis
 */
@ManagedBean
@ViewScoped
public class GerenciarAgendaMB implements Serializable {

    /**
     * Creates a new instance of GerenciarAgendaMB
     */
    private ScheduleModel eventModel;
    private Dentista dentista;
    private TratamentoDao dao;
    private List<Tratamento> tratamentos;
    private CompromissoAgenda compromissoSelecionado;

    public GerenciarAgendaMB() {
        this.compromissoSelecionado = new CompromissoAgenda();
        this.dao = new TratamentoDao();
        this.carregarDentista();

        eventModel = new DefaultScheduleModel();
//        Calendar c1 = Calendar.getInstance();
//        c1.set(2012, 11, 13, 10, 30);
//        Date d1 = c1.getTime();
//        c1.set(2012, 11, 13, 11, 30);
//        Date d2 = c1.getTime();
//        eventModel.addEvent(new DefaultScheduleEvent("Champions League Match", d1, d2));
        this.montarAgenda();
    }

    private void montarAgenda() {
        this.tratamentos = dao.tratamentoPorDentista(dentista);
        for (Tratamento tratamento : tratamentos) {
            List<Atendimento> atendimentos = tratamento.getAtendimentos();

            if (!atendimentos.isEmpty()) {

                for (Atendimento atendimento : atendimentos) {
                    int horaInicial;
                    int minutoInicial;
                    int horaFinal;
                    int minutoFinal;
                    switch (atendimento.getHorarioAtendimento()) {
                        case MANHA1:
                            horaInicial = 8;
                            minutoInicial = 00;
                            horaFinal = 8;
                            minutoFinal = 40;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case MANHA2:
                            horaInicial = 8;
                            minutoInicial = 40;
                            horaFinal = 9;
                            minutoFinal = 20;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case MANHA3:
                            horaInicial = 9;
                            minutoInicial = 20;
                            horaFinal = 10;
                            minutoFinal = 00;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case MANHA4:
                            horaInicial = 10;
                            minutoInicial = 00;
                            horaFinal = 10;
                            minutoFinal = 40;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case MANHA5:
                            horaInicial = 10;
                            minutoInicial = 40;
                            horaFinal = 11;
                            minutoFinal = 20;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case MANHA6:
                            horaInicial = 11;
                            minutoInicial = 20;
                            horaFinal = 12;
                            minutoFinal = 00;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case TARDE1:
                            horaInicial = 14;
                            minutoInicial = 00;
                            horaFinal = 14;
                            minutoFinal = 40;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case TARDE2:
                            horaInicial = 14;
                            minutoInicial = 40;
                            horaFinal = 15;
                            minutoFinal = 20;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case TARDE3:
                            horaInicial = 15;
                            minutoInicial = 20;
                            horaFinal = 16;
                            minutoFinal = 00;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case TARDE4:
                            horaInicial = 16;
                            minutoInicial = 00;
                            horaFinal = 16;
                            minutoFinal = 40;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case TARDE5:
                            horaInicial = 16;
                            minutoInicial = 40;
                            horaFinal = 17;
                            minutoFinal = 20;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;
                        case TARDE6:
                            horaInicial = 17;
                            minutoInicial = 20;
                            horaFinal = 18;
                            minutoFinal = 00;
                            this.novoCompromissoAgenda(tratamento, atendimento, horaInicial, minutoInicial, horaFinal, minutoFinal);
                            break;

                    }
                }
            }
        }
    }

    public void onEventSelect(ScheduleEntrySelectEvent selectEvent) {
        ScheduleEvent event = selectEvent.getScheduleEvent();
        this.compromissoSelecionado = (CompromissoAgenda) event.getData();
    }

    private void carregarDentista() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession session = (HttpSession) externalContext.getSession(true);
        this.dentista = (Dentista) session.getAttribute("usuario");
    }

    private void novoCompromissoAgenda(Tratamento tratamento, Atendimento atendimento, int horaInicial, int minutoInicial, int horaFinal, int minutoFinal) {
        Calendar calendarData = Calendar.getInstance();
        calendarData.setTime(atendimento.getDataAtendimento());
        int ano = calendarData.get(Calendar.YEAR);
        int mes = calendarData.get(Calendar.MONTH);
        int dia = calendarData.get(Calendar.DAY_OF_MONTH);

        Calendar calendarAgenda = Calendar.getInstance();
        //(int year, int month, int date, int hourOfDay, int minute) 
        calendarAgenda.set(ano, mes, dia, horaInicial, minutoInicial);
        Date dataInicio = calendarAgenda.getTime();

        calendarAgenda.set(ano, mes, dia, horaFinal, minutoFinal);
        Date dataFim = calendarAgenda.getTime();

        CompromissoAgenda compromisso = new CompromissoAgenda();
        compromisso.setAtendimento(atendimento);
        compromisso.setObservacao(tratamento.getObservacao());
        compromisso.setPaciente(tratamento.getPaciente());
        compromisso.setServicosPrestados(tratamento.getServicosPrestados());

        DefaultScheduleEvent event = new DefaultScheduleEvent(tratamento.getPaciente().getNome(), dataInicio, dataFim, compromisso);
        eventModel.addEvent(event);
    }

    private void horarioManha1(Tratamento tratamento, Atendimento atendimento) {
        Calendar calendarData = Calendar.getInstance();
        calendarData.setTime(atendimento.getDataAtendimento());
        int ano = calendarData.get(Calendar.YEAR);
        int mes = calendarData.get(Calendar.MONTH);
        int dia = calendarData.get(Calendar.DAY_OF_MONTH);

        Calendar calendarAgenda = Calendar.getInstance();
        //(int year, int month, int date, int hourOfDay, int minute) 
        calendarAgenda.set(ano, mes, dia, 8, 00);
        Date dataInicio = calendarAgenda.getTime();

        calendarAgenda.set(ano, mes, dia, 8, 40);
        Date dataFim = calendarAgenda.getTime();

        CompromissoAgenda compromisso = new CompromissoAgenda();
        compromisso.setAtendimento(atendimento);
        compromisso.setObservacao(tratamento.getObservacao());
        compromisso.setPaciente(tratamento.getPaciente());
        compromisso.setServicosPrestados(tratamento.getServicosPrestados());

        DefaultScheduleEvent event = new DefaultScheduleEvent(tratamento.getPaciente().getNome(), dataInicio, dataFim, compromisso);
        eventModel.addEvent(event);
    }

    private void horarioManha2(Tratamento tratamento, Atendimento atendimento) {
        Calendar calendarData = Calendar.getInstance();
        calendarData.setTime(atendimento.getDataAtendimento());
        int ano = calendarData.get(Calendar.YEAR);
        int mes = calendarData.get(Calendar.MONTH);
        int dia = calendarData.get(Calendar.DAY_OF_MONTH);

        Calendar calendarAgenda = Calendar.getInstance();
        //(int year, int month, int date, int hourOfDay, int minute) 
        calendarAgenda.set(ano, mes, dia, 8, 40);
        Date dataInicio = calendarAgenda.getTime();

        calendarAgenda.set(ano, mes, dia, 9, 20);
        Date dataFim = calendarAgenda.getTime();

        CompromissoAgenda compromisso = new CompromissoAgenda();
        compromisso.setAtendimento(atendimento);
        compromisso.setObservacao(tratamento.getObservacao());
        compromisso.setPaciente(tratamento.getPaciente());
        compromisso.setServicosPrestados(tratamento.getServicosPrestados());

        DefaultScheduleEvent event = new DefaultScheduleEvent(tratamento.getPaciente().getNome(), dataInicio, dataFim, compromisso);
        eventModel.addEvent(event);
    }

    public ScheduleModel getEventModel() {
        return eventModel;
    }

    public void setEventModel(ScheduleModel eventModel) {
        this.eventModel = eventModel;
    }

    public CompromissoAgenda getCompromissoSelecionado() {
        return compromissoSelecionado;
    }

    public void setCompromissoSelecionado(CompromissoAgenda compromissoSelecionado) {
        this.compromissoSelecionado = compromissoSelecionado;
    }
}
